package com.dtx.stream.map;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MapDemo {
    public static void main(String[] args) {
        //（1）给定一个数字列表，如何返回一个由每个书的平方构成的列表呢？例如，给定[1,2,3,4,5],应该返回[1,4,9,16,25]。
        //你可以利用map方法的Lambda，接受一个数字，并返回该数字平方的Lambda来解决这个问题。
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> squares = numbers.stream().map(n -> n * n).collect(Collectors.toList());
        for (Integer square : squares) {
            System.out.println(square);
        }
        //（2）给定两个数字列表，如何返回所有的数对呢？例如，给定列表[1,2,3]和列表[3,4],
        //应该返回[(1,3),(1,4),(2,3),(2,4),(3,3),(3,4)]。可以用两个元素的数组来代替数对
        //你可以使用两个map来迭代这两个列表，并生成数对。但这样会返回一个Stream<Stream<Integer[]>>。
        //你需要让生成的流扁平化，以得到一个Stream<Integer[]>。这正是flatMap所做的；
        List<Integer> numbers1 = Arrays.asList(1, 2, 3);
        List<Integer> numbers2 = Arrays.asList(3, 4);
        List<int[]> list = numbers1.stream().flatMap(i -> numbers2.stream()
                .map(j -> new int[]{i, j})
        )
                .collect(Collectors.toList());
        for (int[] ints : list) {
            System.out.println(Arrays.toString(ints));
        }
    }

    @Test
    public void test(){
        //如何扩展前一个例子，只返回总和能被3整除的数对呢?
        //filter可以配合谓词使用筛选流中的元素。因为在flatMap操作后，你有了一个代表数对的int[]流，
        //所以只需要一个谓词来检查总和是否能被3整除就可以了；
        List<Integer> numbers1 = Arrays.asList(1, 2, 3);
        List<Integer> numbers2 = Arrays.asList(3, 4);
        List<int[]> pairs = numbers1.stream()
                .flatMap(i ->
                        numbers2.stream()
                                .filter(j -> (i + j) % 3 == 0)
                                .map(j -> new int[]{i, j})
                )
                .collect(Collectors.toList());
        for (int[] pair : pairs) {
            System.out.println(Arrays.toString(pair));
        }
    }
}
